package com.fy.proj2_login_api.util;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.util.Random;

// 验证码工具类，提供验证码生成和验证功能
public class CaptchaUtil {
    // 验证码字符集，去除容易混淆的字符（如0、O、1、I等）
    private static final String CHAR_STRING = "ABCDEFGHJKLMNPQRSTUVWXYZabcdefghjkmnpqrstuvwxyz23456789";
    // 验证码图片宽度
    private static final int WIDTH = 120;
    // 验证码图片高度
    private static final int HEIGHT = 40;
    // 验证码字体大小
    private static final int FONT_SIZE = 24;
    // 验证码字符长度
    private static final int CODE_LENGTH = 4;

    /**
     * 生成随机验证码字符串
     * @return 验证码字符串
     */
    public static String generateCaptchaCode() {
        // 创建随机数生成器
        Random random = new Random();
        // 使用StringBuilder构建验证码字符串
        StringBuilder captcha = new StringBuilder();
        
        // 循环生成指定长度的验证码
        for (int i = 0; i < CODE_LENGTH; i++) {
            // 从字符集中随机选择一个字符的索引
            int index = random.nextInt(CHAR_STRING.length());
            // 将字符添加到验证码字符串中
            captcha.append(CHAR_STRING.charAt(index));
        }
        
        // 返回生成的验证码字符串
        return captcha.toString();
    }

    /**
     * 生成验证码图片
     * @param captchaCode 验证码字符串
     * @return 验证码图片
     */
    public static BufferedImage generateCaptchaImage(String captchaCode) {
        // 创建指定宽高的RGB图片
        BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
        // 获取图片的2D绘图对象
        Graphics2D g2d = (Graphics2D) image.getGraphics();
        
        // 设置背景色为白色
        g2d.setColor(Color.WHITE);
        // 填充整个背景
        g2d.fillRect(0, 0, WIDTH, HEIGHT);
        
        // 设置字体样式
        Font font = new Font("Arial", Font.BOLD, FONT_SIZE);
        // 应用字体
        g2d.setFont(font);
        
        // 创建随机数生成器
        Random random = new Random();
        // 循环绘制验证码的每个字符
        for (int i = 0; i < captchaCode.length(); i++) {
            // 设置随机颜色（较深的颜色，确保可读性）
            g2d.setColor(new Color(random.nextInt(110), random.nextInt(110), random.nextInt(110)));
            // 在指定位置绘制字符
            g2d.drawString(String.valueOf(captchaCode.charAt(i)), 15 + i * 25, 28);
        }
        
        // 添加干扰线，增加识别难度
        for (int i = 0; i < 8; i++) {
            // 设置随机颜色（较浅的颜色，不干扰字符识别）
            g2d.setColor(new Color(random.nextInt(160), random.nextInt(160), random.nextInt(160)));
            // 随机生成干扰线的起点和终点
            int x1 = random.nextInt(WIDTH);
            int y1 = random.nextInt(HEIGHT);
            int x2 = random.nextInt(WIDTH);
            int y2 = random.nextInt(HEIGHT);
            // 绘制干扰线
            g2d.drawLine(x1, y1, x2, y2);
        }
        
        // 添加干扰点，进一步增加识别难度
        for (int i = 0; i < 30; i++) {
            // 设置随机颜色（较浅的颜色，不干扰字符识别）
            g2d.setColor(new Color(random.nextInt(160), random.nextInt(160), random.nextInt(160)));
            // 随机生成干扰点的位置
            int x = random.nextInt(WIDTH);
            int y = random.nextInt(HEIGHT);
            // 绘制干扰点（小圆点）
            g2d.fillOval(x, y, 1, 1);
        }
        
        // 释放绘图资源
        g2d.dispose();
        // 返回生成的验证码图片
        return image;
    }

    /**
     * 验证用户输入的验证码是否正确
     * @param userInput 用户输入的验证码
     * @param captchaCode 正确的验证码
     * @return 验证结果
     */
    public static boolean validateCaptcha(String userInput, String captchaCode) {
        // 如果用户输入或正确验证码为空，直接返回false
        if (userInput == null || captchaCode == null) {
            return false;
        }
        // 比较用户输入和正确验证码（忽略大小写）
        return userInput.equalsIgnoreCase(captchaCode);
    }
}